[기초] 배열
Java 배열의 선언·초기화, 객체 배열, 깊은/얕은 복사, 다차원 배열, 그리고 ArrayList의 기초를 예제로 정리한 노트다. 핵심은 배열이 고정 길이·연속 구조라 크기를 못 늘리는 한계가 있고, System.arraycopy는 객체 배열에서 참조만 복사하는 얕은 복사라는 점, 그리고 이런 한계를 보완해 크기 가변적이고 get()/add()로 다루는 ArrayList를 함께 다룬다는 점이다.
실행 환경
제네릭
ArrayList<T>와 향상된 for문이 사용되어 최소 Java 5 이상 환경을 전제로 한다. 구체적인 JDK 마이너 버전은 코드상 명시되어 있지 않다.
NOTE
원문을 AI가 검토·보강함(사실 확인 권장).
📌 개념
배열의 기초
- 배열의 시작 인덱스는 “0”이다
- Fixed length : 고정된 길이
- 배열은 연속된 구조 (중간에 빈 공간이 있으면 안 됨)
- 배열 공간이 꽉 차면 더 넣을 수 없음 (→ 새로운 더 큰 배열을 만들어야 함)
System.out.println(arr.length);// 배열 공간 개수 출력
배열 선언
int[] arr = new int[10];
int[] arr = new int[] {1,2,3}; // 초기화 (3개의 공간이 형성됨)
int[] num = {1,2,3}; // 배열 선언 및 초기화 (3개 공간 형성)
int[] num;
num = new int[3];
// 초기화를 할 경우 배열 개수 지정 X- 문자 배열(char)
char[] alpabet = new char[26];
char ch = 'A';
for(int i=0; i<alpabet.length; i++, ch++){
alpabet[i] = ch;
} // 알파벳이 순서대로 찍힘
// char 문자도 결국에는 정수임. (ASCII 코드)객체 배열 만들기
클래스명[] 변수명 = new 클래스명[배열개수];
변수명[0] = new 클래스명("인자1","인자2");
변수명[1] = new 클래스명("인자1","인자2");
변수명[2] = new 클래스명("인자1","인자2");setter / getter
- setter : private인 클래스 내부 멤버변수를 수정할 때 사용
- getter : private인 클래스 내부 멤버변수를 출력할 때 사용
배열 복사 (깊은 복사 / 얕은 복사)
System.arraycopy(원본, 복사 시작지점, 복사본, 복사 시작지점, 복사 개수);
// 직접 복사 (get/set 이용)
for(int i=0; i< bookArray1.length; i++){
bookArray2[i].setAuthor(bookArray1[i].getAuthor());
}NOTE
System.arraycopy는 요소(참조)를 그대로 복사하므로, 객체 배열에서는 **얕은 복사(shallow copy)**에 해당한다(원본과 복사본이 같은 객체를 가리켜 값이 함께 바뀜). 각 요소를 새 객체로 만들어 넣는 방식이 **깊은 복사(deep copy)**다.
배열 전체 출력
String[] array = new String[] {"Java", "Good"};
// ⭕ String[] array = {"Java", "Good"};
int[] array1 = new int[] {1,2,3};
// ⭕ int[] array1 = {1,2,3};
for(int i=0; i<array.length; i++){
System.out.println(array[i]);
}
for(String s : array){
System.out.println(s);
}
for(int i : array1){
System.out.println(i);
}다차원 배열
arr[행][열]
int[][] array = new int[2][3];
int[][] array = {{1,2,3}, {4,5,6}};
System.out.println(arr.length); // ➡️ 행의 개수(2)
System.out.println(arr[0].length); // ⬇️ 열의 개수(3)ArrayList (Library)
- 배열 클래스에 관하여 많은 기능을 가짐
Ctrl + Shift + O: 자동으로 ArrayList가 import 됨- 생성:
ArrayList<클래스명> 변수명 = new ArrayList<클래스명>();
// 🚫 인덱스 연산자 사용 불가능
ArrayList<String> list = new ArrayList<String>();
for(int i=0; i<list.size(); i++){
System.out.println(list[i]); // 인덱스 연산 불가능
}
// ⭕ 향상된 for문으로 전체 출력
for(String s : list){
System.out.println(s);
}
// ⭕ get()으로 인덱스 접근
for(int i=0; i<list.size(); i++){
System.out.println(list.get(i));
}// 값 넣기
ArrayList<Book> library = new ArrayList<Book>();
library.add(new Book("태백산맥1","조경례"));
library.add(new Book("태백산맥2","조경례"));
library.add(new Book("태백산맥3","조경례"));- 기본 배열:
String[] 리스트변수명 = new String[10]; - 리스트 추가:
리스트명.add(내용),리스트명.add(위치, 내용) - 배열 정보 가져오기:
리스트명.get(위치)
💻 예시
- Student class
package arraylist심화;
import java.util.ArrayList;
public class Student {
private int studentID;
private String studentName;
private ArrayList<subject> subjectList;
public Student(int studentID, String studentName) {
this.studentID = studentID;
this.studentName = studentName;
subjectList =new ArrayList<subject>();
}
public void addSubject(String name, int score) {
subject subject = new subject();
subject.setName(name);
subject.setScorePoint(score);
subjectList.add(subject);
//subjectList.add(subject.setName(name),subject.setScorePoint(score));
}
public void showStudentInfo(){
for(subject subject : subjectList) {
System.out.println("학생" + studentName +"님의" + subject.getName() + " 과목의 성적은 " + subject.getScorePoint() + "점 입니다" );
}
}
}- Subject class
package arraylist심화;
public class subject {
private String name;
private int scorePoint;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScorePoint() {
return scorePoint;
}
public void setScorePoint(int scorePoint) {
this.scorePoint = scorePoint;
}
}- test
package arraylist심화;
public class test {
public static void main(String[] args) {
Student studentLee = new Student(1001,"Lee");
studentLee.addSubject("국어", 100);
studentLee.addSubject("수학", 100);
studentLee.addSubject("영어", 100);
studentLee.showStudentInfo();
}
}